/*
题目描述：
一天，小美在写英语作业时，发现了一个十分优美的字符串：这个字符串没有任何两个字符相同。
于是，小美随手写下了一个字符串，她想知道这个字符串的的所有子序列，有多少个是优美的。
由于答案可能会很大，输出对20210101取模后的结果。

一个字符串的子序列定义为：原字符串删除0个或多个字符后剩下的字符保持原有顺序拼接组成的字符串为原串的子序列。
如：ab是acba的子序列，但bc则不是。在本题中。空串也为原串的子序列。

两个子序列不相同，当且仅当他们对应原串的下标不相同。如aab则含有两个子序列ab。


输入描述
输入仅一行一个仅由小写字母组成的字符串。

设字符串长度为len：

1<=len<=1000000;

输出描述
输出仅包含一个正整数，表示答案对20210101取模后的结果。


样例输入
aabc
样例输出
12

提示
有下列优美的子序列：””, ”a”, “a”, “b”, “c”, “ab”, “ab”, “bc”, “ac”, “ac”, “abc”, “abc”，
一共12个。


*/


#include <iostream>
#include <cstdio>
#include <stack>
#include <algorithm>
#include <vector>
#include <string>

using namespace std;

const int MOD=20210101;

int solve(string s){
    int N=s.size();
    vector<int> dp(N+5,0),last(26,-1);
    dp[0]=1;
    
    for(int i=0;i<N;i++){
        int x=s[i]-'a';
        dp[i+1]=(dp[i]*2)%MOD;
        if(last[x]>=0){
            dp[i+1]-=dp[last[x]];
        }
        dp[i+1] %=MOD;
        last[x]=i;
    }
    if(dp[N]<0) dp[N]+=MOD;
    for(int i=0;i<=N;i++){
        cout << dp[i]<< " ";
    }cout <<endl;
    return dp[N];
}

int main(){
    string s;
    cin >> s;
    cout << solve(s)<<endl;



    return 0;
}